package cn.jly.bigdata.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author lanyangji
 * @date 2019/11/24 10:47
 */
object Spark02_expr17 {

  def main(args: Array[String]): Unit = {

    // local模式

    // 创建 SparkConf 对象
    // 这边也自定义了本地的模式（分配多少个cpu）
    // app id
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")

    // 创建spark上下文对象，SparkContext -> sc
    val sc = new SparkContext(sparkConf)

    val listRDD: RDD[(Int, Int)] = sc.makeRDD(List((1, 3), (1, 2), (1, 4), (2, 3), (3, 6), (3, 8)), 3)

    // foldByKey算子，aggregateByKey的简化操作，分区内和分区间操作函数相同
    // 计算key相同的值的和
    val resRDD: RDD[(Int, Int)] = listRDD.foldByKey(0)(_ + _)

    println(resRDD.collect().mkString(","))

    val combineRDD: RDD[(Int, Int)] = listRDD.combineByKey(
      x => x,
      (x: Int, y) => x + y, // x加类型说明，因为无法进行类型推断
      (x: Int, y: Int) => x + y
    )

    val array: Array[Array[(Int, Int)]] = combineRDD.glom().collect()

    for (elem <- array) {
      println(elem.mkString(","))
    }
  }
}
